<template>
  <div class="info-template-container">
    <div v-if="!props.hideHead" class="info-template-header">
      <div class="info-template-title">
        <span>{{ curTitle }}</span>
      </div>
      <div>
        <el-button v-if="testConnectText" secondary @click="check">{{ testConnectText }}</el-button>
        <el-button v-if="showValidate" secondary @click="check">{{
          t('datasource.validate')
        }}</el-button>
        <el-button type="primary" @click="edit">{{ t('commons.edit') }}</el-button>
      </div>
    </div>
    <div class="info-template-content clearfix">
      <div class="info-content-item" v-for="item in settingList" :key="item.pkey">
        <div class="info-item-label">
          <span>{{ t(item.pkey) }}</span>
          <el-tooltip
            v-if="tooltipItem[item.pkey]"
            effect="dark"
            :content="tooltipItem[item.pkey]"
            placement="top"
          >
            <el-icon class="info-tips"
              ><Icon name="dv-info"><dvInfo class="svg-icon" /></Icon
            ></el-icon>
          </el-tooltip>
        </div>
        <div class="info-item-content">
          <div class="info-item-pwd" v-if="item.type === 'pwd'">
            <span class="info-item-pwd-span">{{
              pwdItem[item.pkey]['hidden'] ? '********' : item.pval
            }}</span>

            <el-tooltip
              v-if="props.copyList.includes(item.pkey)"
              effect="dark"
              :content="t('common.copy')"
              placement="top"
            >
              <el-button text @click="copyVal(item.pval)" class="setting-tip-btn">
                <template #icon>
                  <Icon name="de-copy"><deCopy class="svg-icon" /></Icon>
                </template>
              </el-button>
            </el-tooltip>

            <el-tooltip
              effect="dark"
              :content="
                pwdItem[item.pkey]['hidden'] ? t('system.click_to_show') : t('system.click_to_hide')
              "
              placement="top"
            >
              <el-button text @click="switchPwd(item.pkey)" class="setting-tip-btn">
                <template #icon>
                  <Icon
                    ><component
                      class="svg-icon"
                      :is="pwdItem[item.pkey]['hidden'] ? eye : eyeOpen"
                    ></component
                  ></Icon>
                </template>
              </el-button>
            </el-tooltip>
          </div>
          <span v-else-if="item.pkey.includes('basic.dsIntervalTime')">
            <span>{{ item.pval + ' ' + executeTime + t('common.every_exec') }}</span>
          </span>
          <template v-else>
            <span style="word-break: break-all">{{ item.pval }}</span>
            <el-tooltip
              v-if="props.copyList.includes(item.pkey)"
              effect="dark"
              :content="t('common.copy')"
              placement="top"
            >
              <el-button text @click="copyVal(item.pval)" class="setting-tip-btn">
                <template #icon>
                  <Icon name="de-copy"><deCopy class="svg-icon" /></Icon>
                </template>
              </el-button>
            </el-tooltip>
          </template>
        </div>
      </div>
    </div>
  </div>
</template>
<script lang="ts" setup>
import eye from '@/assets/svg/eye.svg'
import eyeOpen from '@/assets/svg/eye-open.svg'
import dvInfo from '@/assets/svg/dv-info.svg'
import deCopy from '@/assets/svg/de-copy.svg'
import { ref, defineProps, PropType, computed } from 'vue'
import { useI18n } from '@/hooks/web/useI18n'
import { SettingRecord, ToolTipRecord } from './SettingTemplate'
import useClipboard from 'vue-clipboard3'
import { ElMessage } from 'element-plus-secondary'
const { toClipboard } = useClipboard()
const { t } = useI18n()
const props = defineProps({
  settingKey: {
    type: String,
    default: 'basic'
  },
  labelTooltips: {
    type: Array as PropType<ToolTipRecord[]>,
    default: () => []
  },
  settingData: {
    type: Array as PropType<SettingRecord[]>,
    default: () => []
  },
  settingTitle: {
    type: String,
    default: ''
  },
  hideHead: {
    type: Boolean,
    default: false
  },
  showValidate: {
    type: Boolean,
    default: false
  },
  testConnectText: {
    type: String,
    default: null
  },
  copyList: {
    type: Array as PropType<string[]>,
    default: () => []
  }
})
const executeTime = ref(t('system.and_0_seconds'))
const curTitle = computed(() => {
  return props.settingTitle || t('system.basic_settings')
})
const copyVal = async val => {
  try {
    await toClipboard(val)
    ElMessage.success(t('common.copy_success'))
  } catch (e) {
    ElMessage.warning(t('common.copy_unsupported'), e)
  }
}
const loadList = () => {
  settingList.value = []
  if (props.settingData?.length) {
    props.settingData.forEach(item => {
      if (item.pkey.includes('basic.dsExecuteTime')) {
        executeTime.value = getExecuteTime(item.pval)
      } else {
        settingList.value.push(item)
      }
    })
  }
}

const getExecuteTime = val => {
  const options = [
    { value: 'minute', label: t('system.time_0_seconds') },
    { value: 'hour', label: t('system.and_0_seconds_de') }
  ]
  return options.filter(item => item.value === val)[0].label
}

const settingList = ref([] as SettingRecord[])

const init = () => {
  if (props.settingData?.length) {
    loadList()
  }
}
const pwdItem = ref({})

const formatPwd = () => {
  settingList.value.forEach(setting => {
    if (setting.type === 'pwd') {
      pwdItem.value[setting.pkey] = { hidden: true }
    }
  })
}

const tooltipItem = ref({})
const formatLabel = () => {
  props.labelTooltips?.length &&
    props.labelTooltips.forEach(tooltip => {
      tooltipItem.value[tooltip.key] = tooltip.val
    })
}

const switchPwd = (pkey: string) => {
  pwdItem.value[pkey]['hidden'] = !pwdItem.value[pkey]['hidden']
}

const emits = defineEmits(['edit', 'check'])
const edit = () => {
  emits('edit')
}

const check = () => {
  emits('check')
}
defineExpose({
  init
})
init()
formatPwd()
formatLabel()
</script>

<style lang="less" scope>
.setting-tip-btn {
  height: 24px !important;
  width: 24px !important;
  margin-left: 4px !important;
  .ed-icon {
    font-size: 16px;
  }
}
.info-template-container {
  padding: 24px 24px 8px 24px;
  background: var(--ContentBG, #ffffff);
  border-radius: 4px;
  .info-template-header {
    display: flex;
    margin-top: -4px;
    align-items: center;
    justify-content: space-between;
    .info-template-title {
      height: 24px;
      line-height: 23px;
      font-size: 16px;
      font-weight: 500;
      color: #1f2329;
    }
  }
  .info-template-content {
    width: 100%;
    margin-top: 12px;
    .info-content-item {
      width: 50%;
      float: left;
      margin-bottom: 16px;
      min-height: 46px;
      .info-item-label {
        height: 22px;
        line-height: 22px;
        display: flex;
        align-items: center;
        span {
          font-size: 14px;
          color: #646a73;
          font-weight: 400;
        }
        i {
          margin-left: 2px;
        }
      }
      .info-item-content {
        line-height: 22px;
        span {
          font-size: 14px;
          color: #1f2329;
          font-weight: 400;
        }

        .info-item-pwd {
          height: 22px;
          line-height: 22px;
          width: 100%;
          display: flex;
          align-items: center;
          i {
            margin-left: 2px;
          }
          .info-item-pwd-span {
            max-width: calc(100% - 84px);
            overflow: hidden;
            white-space: nowrap;
            text-overflow: ellipsis;
          }
        }
      }
    }
  }
  .clearfix::after {
    content: '';
    display: table;
    clear: both;
  }
}
</style>
